/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package educar.models;

import educar.db.JPA;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 *En esta clase se encuentran lo metodos necesario para que un Administrador 
 * pueda administrar una Dedicacion.
 * @author Flubber
 */
public class Dedicacion {
    
    private static JPA jpa = new JPA(); //Atributo <code>JPA</code> usado para cear una instancia que contenga un query
    private String dniDocente;  //<code>String</code> usada para almacenar el dni de un docente.
    private String codFacultad; //<code>String</code> usada para almacenar el codigo de una facultad.
    private String dedicacion;  //<code>String</code> usada para almacenar las hs de una dedicacion.
    private String codCargo;    //<code>String</code> usada para almacenar el codigo de un cargo.
  
    
    /**
     * <hr>
     * Dedicacion(): Contructor con parametros de la clase Dedicacion.
     * <hr>
     * @param dniDocente
     * @param codFacultad
     * @param codCargo
     * @param dedicacion
     */
    public Dedicacion(String dniDocente, String codFacultad, String codCargo, String dedicacion) {
        this.setDNIDocente(dniDocente);
	this.setCodFacultad(codFacultad);
	this.setCodCargo(codCargo);                
        this.setDedicacion(dedicacion);
    }//Fin del metodo Dedicacion(String, String, String, String).

  
    /**
     * <hr>
     * Dedicacion(): Constructor que recibe como parametro un arreglo.
     * <hr>
     * @param dedicacion Un <code>String[]</code> que contiene los datos necesarios de una dedicacion.
     */
    public Dedicacion (String[] dedicacion) {
                this.setDNIDocente(dedicacion[0]);
		this.setCodFacultad(dedicacion[1]);
                this.setCodCargo(dedicacion[2]);                
                this.setDedicacion(dedicacion[3]);

    }//Fin del metodo Dedicacion(String[])

    
    /**
     * <hr>
     * authenticate(): Verifca que no haya otro elemento con los mismos atributos en la base de datos.
     * <hr>
     * @param dniDocente
     * @param codFacultad
     * @param codCargo
     * @param dedicacion
     * @return <code>true</code> si no exite otro elemento con los mismos atributos en la base de datos
     * o <code>false</code> en caso contrario.
     */
    public static boolean authenticate(String dniDocente, String codFacultad, String codCargo,  String dedicacion) {
        try {
            Dedicacion d = Dedicacion.getDedicacionByKeys(dniDocente, codFacultad);
            if ((d.getCodCargo().equals(codCargo)) && (d.getDedicacion().equals(dedicacion))){
            return true;
            }
            return false;
	} catch (dedicacionNotFound ex) {
            return false;
	}
    }//Fin del metodo authenticate(String, String, String, String)

    
    /**
     * <hr>
     * save():Guarda una dedicacion en la base de datos.
     * Intenta obtener una dedicacion de la base de datos si lo logra o
     * por cualquier problema que ocurra al intentar obtenerlo o guardarlo retorna false, 
     * pero si logra guardar la dedicacion retorna true.
     * <hr>
     * @return <code>true</code> si logra guardar la dedicacion,
     * <code>false</code> si ya existe el elemento o que ocurra algun problema.
     */    
    public boolean save() {
        try {   //Se intenta obtener una dedicacion
            Dedicacion.getDedicacionByKeys(dniDocente, codFacultad);                      
            return false;
	} catch (dedicacionNotFound e1) {   //No existe esa dedicacion entonces se intenta guardar
            String[] columns = { "DNIdocente", "codFacultad", "codCargo",  "dedicacion" };
            PreparedStatement stm = jpa.newRecord("educar_dev.pertenece", columns);
            try {   //Intenta setear los datos
                stm.setString(1, dniDocente);
		stm.setString(2, codFacultad);
		stm.setString(3, codCargo);                                
                stm.setString(4, dedicacion);
            } catch (SQLException e) {  //Ocurrio un error al intentar ingresar la dedicacion
                e.printStackTrace();
		return false;
            }
            jpa.create(stm);    //Guarda la dedicacion en la base de datos
            return true;
	}
    }//Fin del metodo save()

    
    /**
     * <hr> 
     * destroy(): Elimina una dedicacion de la base de datos
     * <hr>
     */
    public void destroy() {
        String[] keys = { "DNIdocente", "codFacultad" };
        String[] ids = {this.getDNIDocente(), this.getCodFacultad()};
	jpa.destroyByKeys("pertenece", keys , ids);
    }//Fin del metodo destroy()
    
    
    /**
     * <hr>
     * destroyDedicacionByKeys(): Metodo estatico usado para eliminar una dedicacion de la base de datos
     * pasandole como parametro los atributos clave de la base de datos.
     * <hr>
     * @param dniDocente
     * @param codFacultad
     */  
    public static void destroyDedicacionByKeys(String dniDocente, String codFacultad) {
        String[] keys = { "DNIdocente", "codFacultad" };
        String[] ids = {dniDocente, codFacultad};
        jpa.destroyByKeys("pertenece", keys , ids);
    }//Fin del metodo destroyDedicacionByKeys(Strin, String)
	
    
    /**
     * <hr>
     * getDedicacionByKeys(): Dado los atributos clave de la base de datos, consulto la base de datos
     * usando estos atributos para obtener todos los datos del mismo, en el caso que este 
     * no se encuentre lanza una excepcion dedicacionNotFound.
     * <hr>
     * @param dniDocente
     * @param codFacultad
     * @return Dedicacion
     * @throws dedicacionNotFound en caso de no encontrar la dedicacion buscada.
     */
    public static Dedicacion getDedicacionByKeys(String dniDocente, String codFacultad) throws dedicacionNotFound {
        //Consulto en la base de datos la tabla pertenece, usando dniDocente y codFacultad como clave
        ResultSet rs = null;
	Dedicacion d = null;
        String[] keys = {"DNIdocente", "codFacultad"};
        String[] ids = {dniDocente, codFacultad};
	rs = jpa.getByKeys("pertenece", keys , ids);
	try {
            if (rs.next()) {
                d = new Dedicacion(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
            } else {
                throw new dedicacionNotFound();
            }
	} catch (SQLException e) {
            e.printStackTrace();
	}
        return d;
    }//Fin del metodo getDedicacionByKeys(String, String).

    
    /**
     * <hr>
     * setDedicacionByKeys(): Este metodo modifica a una dedicacion usando sus atributos clave.
     * <hr>
     * @param oldDNIDocente uno de los atributos clave de la dedicacion que quiero modificar
     * @param oldCodFacultad el otro atributo clave de la dedicacion que quiero modificar.
     */
    public boolean setDedicacionByKeys (String oldDNIDocente, String oldCodFacultad) {
        String[] keys = {"DNIdocente", "codFacultad"};
        String[] ids = {oldDNIDocente, oldCodFacultad};
        jpa.updateByKeys("pertenece", "dedicacion", dedicacion, keys, ids);                
        jpa.updateByKeys("pertenece", "codCargo", codCargo, keys, ids);
        jpa.updateByKeys("pertenece", "codFacultad", codFacultad, keys, ids);
        ids[1] = codFacultad;
        jpa.updateByKeys("pertenece", "DNIdocente", dniDocente, keys, ids);
	return true;
    }//Fin de la clase setDedicacionByKeys(String, String)
    
    
    /**
     * DNI de un Docente de una Dedicacion
     * @return dniDocente
     */
    public String getDNIDocente() {
        return dniDocente;
    }

    
    /**
     * Asigna un dni de un Docente a una Dedicacion
     * @param dniDocente 
     */
    public void setDNIDocente(String dniDocente) {
        this.dniDocente = dniDocente;
    }

    
    /**
     * Codigo de una Facultad de una Dedicacion
     * @return codFacultad
     */
    public String getCodFacultad() {
        return codFacultad;
    }

    
    /**
     * Asigna un Codigo de una Facultad a una Dedicacion
     * @param codFacultad 
     */
    public void setCodFacultad(String codFacultad) {
	this.codFacultad = codFacultad;
    }

    
    /**
     * Codigo de un Cargo de una Dedicacion
     * @return codCargo
     */
    public String getCodCargo() {
        return codCargo;
    }

    
    /**
     * Asigna un Codigo de un Cargo a una Dedicacion
     * @param codCargo 
     */    
    public void setCodCargo(String codCargo) {
        this.codCargo = codCargo;
    }

    
    /**
     * Hs de una Dedicacion
     * @return dedicacion
     */ 
    public String getDedicacion() {
        return dedicacion;
    }

    
    /**
     * Asigna una hs a una Dedicacion
     * @param dedicacion 
     */ 
    public void setDedicacion(String dedicacion) {
        this.dedicacion = dedicacion;
    }
}//Fin de la clase Dedicacion.
